{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Dyna Q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from pycolab.examples.classics import blocking_maze as env1\n",
    "from pycolab.examples.classics import shortcut_maze as env2\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from pycolab.rendering import ObservationToFeatureArray\n",
    "import multiprocessing\n",
    "from collections import deque\n",
    "import math\n",
    "from itertools import product\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def DynaQ_BlockingMaze(N):\n",
    "    episode_step = deque()\n",
    "    max_steps= 3000\n",
    "    epsilon = 0.2\n",
    "    alpha = 0.05\n",
    "    gamma = 0.95\n",
    "    game  = env1.make_game()\n",
    "    Qs_a = np.zeros([game.rows*game.cols,4])\n",
    "    position = ObservationToFeatureArray(['!'])\n",
    "    obs_init, reward, _ = game.its_showtime(0)\n",
    "    pos = position(obs_init).flatten()\n",
    "    s_ini = np.where(pos == 1)[0][0]\n",
    "    replay_memory = deque()\n",
    "    all_rewards = deque()\n",
    "    model = {}\n",
    "    for steps in range(max_steps):\n",
    "        action = np.random.choice([np.random.choice(4),np.argmax(Qs_a[s_ini])], p=[epsilon,1-epsilon])\n",
    "        obs_new, reward,_ = game.play(action,steps)\n",
    "        all_rewards.append(reward)\n",
    "        reward -= 0.1\n",
    "        #reward += 0.001*math.sqrt(steps/2)\n",
    "        if game.game_over:\n",
    "            replay_memory.append((s_ini,action))\n",
    "            model[(s_ini, action)] = (reward, None)\n",
    "            Qs_a[s_ini,action] += alpha*(reward - Qs_a[s_ini,action])\n",
    "            game  = env1.make_game()\n",
    "            position = ObservationToFeatureArray(['!'])\n",
    "            obs_init, reward, _ = game.its_showtime(0)\n",
    "            pos = position(obs_init).flatten()\n",
    "            s_ini = np.where(pos == 1.)[0][0]\n",
    "        else:\n",
    "            pos_new = position(obs_new).flatten()\n",
    "            s_next = np.where(pos_new == 1.)[0][0]\n",
    "            replay_memory.append((s_ini,action))\n",
    "            model[(s_ini, action)] = (reward, s_next)\n",
    "            Qs_a[s_ini,action] += alpha*(reward +gamma*np.max(Qs_a[s_next])- Qs_a[s_ini,action])\n",
    "            s_ini = s_next\n",
    "        for i in range(N):\n",
    "            s, a = replay_memory[np.random.choice(len(replay_memory))]\n",
    "            r, sprime = model[(s,a)]\n",
    "            if sprime is None:\n",
    "                Qs_a[s,a] += alpha*(r - Qs_a[s,a])\n",
    "            else:\n",
    "                Qs_a[s,a] += alpha*(r + gamma*np.max(Qs_a[sprime])- Qs_a[s,a])\n",
    "    return np.cumsum(all_rewards), model, Qs_a     "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 0 ns, sys: 8 ms, total: 8 ms\n",
      "Wall time: 2.89 s\n"
     ]
    }
   ],
   "source": [
    "N_array = [0 ,5 ,20]\n",
    "with multiprocessing.Pool(4) as p:\n",
    "    %time res = p.map(DynaQ_BlockingMaze, N_array)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0x7f365c21d7b8>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f365c236e80>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for j, r in enumerate(res):\n",
    "    plt.plot(r[0], label='Planning Steps:'+str(N_array[j]))\n",
    "plt.legend()\n",
    "plt.xlabel('Time steps')\n",
    "plt.ylabel('Cumulative Reward')\n",
    "plt.title(\"Performance of Dyna Q for different planning steps for Blocking Maze example\")\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def DynaQ_ShortcutMaze(N):\n",
    "    episode_step = deque()\n",
    "    max_steps= 6500\n",
    "    epsilon = 0.2\n",
    "    alpha = 0.05\n",
    "    gamma = 0.95\n",
    "    game  = env2.make_game()\n",
    "    Qs_a = np.zeros([game.rows*game.cols,4])\n",
    "    position = ObservationToFeatureArray(['!'])\n",
    "    obs_init, reward, _ = game.its_showtime(0)\n",
    "    pos = position(obs_init).flatten()\n",
    "    s_ini = np.where(pos == 1)[0][0]\n",
    "    replay_memory = deque()\n",
    "    all_rewards = deque()\n",
    "    model = {}\n",
    "    for steps in range(max_steps):\n",
    "        action = np.random.choice([np.random.choice(4),np.argmax(Qs_a[s_ini])], p=[epsilon,1-epsilon])\n",
    "        obs_new, reward,_ = game.play(action,steps)\n",
    "        all_rewards.append(reward)\n",
    "        reward -= 0.1\n",
    "        #reward += 0.001*math.sqrt(steps)\n",
    "        if game.game_over:\n",
    "            replay_memory.append((s_ini,action))\n",
    "            model[(s_ini, action)] = (reward, None)\n",
    "            Qs_a[s_ini,action] += alpha*(reward - Qs_a[s_ini,action])\n",
    "            game  = env2.make_game()\n",
    "            position = ObservationToFeatureArray(['!'])\n",
    "            obs_init, reward, _ = game.its_showtime(0)\n",
    "            pos = position(obs_init).flatten()\n",
    "            s_ini = np.where(pos == 1.)[0][0]\n",
    "        else:\n",
    "            pos_new = position(obs_new).flatten()\n",
    "            s_next = np.where(pos_new == 1.)[0][0]\n",
    "            replay_memory.append((s_ini,action))\n",
    "            model[(s_ini, action)] = (reward, s_next)\n",
    "            Qs_a[s_ini,action] += alpha*(reward +gamma*np.max(Qs_a[s_next])- Qs_a[s_ini,action])\n",
    "            s_ini = s_next\n",
    "        for i in range(N):\n",
    "            s, a = replay_memory[np.random.choice(len(replay_memory))]\n",
    "            r, sprime = model[(s,a)]\n",
    "            if sprime is None:\n",
    "                Qs_a[s,a] += alpha*(r - Qs_a[s,a])\n",
    "            else:\n",
    "                Qs_a[s,a] += alpha*(r + gamma*np.max(Qs_a[sprime])- Qs_a[s,a])\n",
    "    return np.cumsum(all_rewards), model, Qs_a    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 36 ms, sys: 12 ms, total: 48 ms\n",
      "Wall time: 1min 4s\n"
     ]
    }
   ],
   "source": [
    "N_array = [0, 5, 20, 200, 400]\n",
    "with multiprocessing.Pool(4) as p:\n",
    "    %time res = p.map(DynaQ_ShortcutMaze,N_array)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0x7f365c11f198>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f365c1860f0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for j, r in enumerate(res):\n",
    "    plt.plot(r[0], label='Planning steps:'+str(N_array[j]))\n",
    "plt.legend()\n",
    "plt.xlabel('Time steps')\n",
    "plt.ylabel('Cumulative Reward')\n",
    "plt.title(\"Performance of Dyna Q for different planning steps for Shortcut Maze example\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Experimental Observation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this experiment we have implemented the Dyna Q algorithm for both the Blocking Maze and the Shortcut maze example. We have designed both the environments using the pycolab framework where our environment essentially looks as follows"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Blocking Maze Environment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "GAME_ART = ['###########',\n",
    "            '#        G#',\n",
    "            '#         #', \n",
    "            '#         #',\n",
    "            '#         #',              \n",
    "            '#*#######.#',        \n",
    "            '#   !     #', \n",
    "            '###########']\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "During the first instance, when $t \\leq 1000$ the state . is passable. the goal state is at G and the gate $*$ is impassable. When $t\\geq1000$ the $.$ state becomes impassable and $*$ becomes passable. Hence the  agent which is represented with $!$ have to take a longer route in order to reach the goal state G"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "### Shortcut Maze Environment "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "GAME_ART = ['###########',\n",
    "            '#        G#',\n",
    "            '#         #', \n",
    "            '#         #',\n",
    "            '#         #',              \n",
    "            '#*#######.#',        \n",
    "            '#   !     #', \n",
    "            '###########']\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The shortcut maze also has a similar game art except for the fact that gate $.$ is initially closed and gate $*$ is opened. When $t\\geq 3000$ both the gates $*$ and $.$ are opened. Hence there exist a shortcut path to the goal state after 3000 timesteps"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this experiment we have observed that for the blocking maze environment, learning stopped whenever the gate\n",
    "that corresponds to the shortest path that the agent could take closes. This is due to the fact that since a \n",
    "reward of +1 is only obtained at the goal state,  when the gate is closed, the Q values corresponding to that \n",
    "particular state is not updated after t=1000. This happens because the agent never comes across that state\n",
    "since that path essentially gets blocked. However there needs to be some mechanism so that each time the agent \n",
    "tries to reach close to the blocked state, the Q values corresponding to it gets penalized. We observed that \n",
    "this can be done using reward shaping where we have added a reward of -0.1 for every step that the agent takes\n",
    "with in the environment.We do not include this reward in the cumulative reward plot, instead this reward essentially penalizes the Q values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
